﻿Imports Entidad
Imports Negocio
Imports Utilitario
Public Class frmReparto

    Dim servicio1 As New VehiculoNegocio
    Dim servicio2 As New ProgramacionNegocio
    Dim servicio3 As New DocumentoClienteNegocio
    Dim servicio4 As New DocumentoClienteDetalleNegocio

    Dim empezar As Boolean = False
    Dim contenido As Boolean = False
    Dim content As Integer = 0

    Sub mensaje(ByVal men As String)
        MsgBox(men, MsgBoxStyle.Information, "Mensajes al Usuario")
    End Sub

    Sub listarPedidosSalidas()
        'LImpiamos ambos datagrids para poder listar siempre el contenido de
        'todos los pedidos que tendran fecha de llegada
        dgvOculto.Rows.Clear()
        dgvReparto.Rows.Clear()

        'obtenemos esa lista de pedidos
        Dim ds As DataSet = servicio2.listarSalidaPedidos(cboVehiculo.SelectedValue.ToString)

        'recorremos la lista de pedidos obtenidos
        For i = 0 To ds.Tables(0).Rows.Count - 1
            'empezamos a ingresar fila por fila en el Datagrid1
            dgvReparto.Rows.Add(False, False, ds.Tables(0).Rows(i)("DCI_Codigo").ToString.Trim, ds.Tables(0).Rows(i)("CLI_Descripcion").ToString.Trim,
                                ds.Tables(0).Rows(i)("TD").ToString.Trim, ds.Tables(0).Rows(i)("Documento").ToString.Trim, ds.Tables(0).Rows(i)("Guia").ToString.Trim.Trim,
                                ds.Tables(0).Rows(i)("Condicion").ToString.Trim, ds.Tables(0).Rows(i)("MON_Abreviatura").ToString.Trim,
                                ds.Tables(0).Rows(i)("Facturado").ToString.Trim, ds.Tables(0).Rows(i)("Pago").ToString.Trim, ds.Tables(0).Rows(i)("LimaProv").ToString.Trim,
                                ds.Tables(0).Rows(i)("CantBul").ToString.Trim, ds.Tables(0).Rows(i)("CantLargo").ToString.Trim,
                                "---", ds.Tables(0).Rows(i)("DCI_Observaciones").ToString.Trim, "", "", "", "", "")

            'empezamos a ingresar fila por fila en el Datagrid2
            dgvOculto.Rows.Add(ds.Tables(0).Rows(i)("DCI_Codigo").ToString.Trim, "", "---", "", "")
        Next

        'no se selecciona la primera fila
        If ds.Tables(0).Rows.Count > 0 Then
            dgvReparto.Rows(0).Selected = False
        End If
    End Sub

    Function obtenerPedidos() As String
        Dim cadena As String = "''"
        For Each fila As DataGridViewRow In dgvOculto.Rows
            If cadena = "" Then
                cadena = "'" & fila.Cells(0).Value & "'"
            Else
                cadena = cadena & ",'" & fila.Cells(0).Value & "'"
            End If
        Next
        Return cadena
    End Function

    Sub setearFlag(codPedido As String, flag As String)
        For Each fila As DataGridViewRow In dgvOculto.Rows
            If fila.Cells("Column19").Value = codPedido Then
                fila.Cells("Column25").Value = flag
            End If
        Next
    End Sub

    Sub setearMotivos(codPedido As String, codMotivo As String, descripcion As String, observacion As String)
        For Each fila As DataGridViewRow In dgvOculto.Rows
            If fila.Cells("Column19").Value = codPedido Then
                fila.Cells("Column22").Value = codMotivo
                fila.Cells("Column23").Value = descripcion
                fila.Cells("Column24").Value = observacion
            End If
        Next
    End Sub

    Sub listarConArticulos()
        dgvReparto.Rows.Clear()

        For Each fila As DataGridViewRow In dgvOculto.Rows
            If fila.Cells("Column25").Value = "1" Then
                Dim dt As DataSet = servicio2.listarSalidaPedidosXPED(cboVehiculo.SelectedValue.ToString, fila.Cells(0).Value)
                dgvReparto.Rows.Add(False, True, dt.Tables(0).Rows(0)("DCI_Codigo").ToString.Trim, dt.Tables(0).Rows(0)("CLI_Descripcion").ToString.Trim,
                                    dt.Tables(0).Rows(0)("TD").ToString.Trim, dt.Tables(0).Rows(0)("Documento").ToString.Trim, dt.Tables(0).Rows(0)("Guia").ToString.Trim.Trim,
                                    dt.Tables(0).Rows(0)("Condicion").ToString.Trim, dt.Tables(0).Rows(0)("MON_Abreviatura").ToString.Trim,
                                    dt.Tables(0).Rows(0)("Facturado").ToString.Trim, dt.Tables(0).Rows(0)("Pago").ToString.Trim, dt.Tables(0).Rows(0)("LimaProv").ToString.Trim,
                                    dt.Tables(0).Rows(0)("CantBul").ToString.Trim, dt.Tables(0).Rows(0)("CantLargo").ToString.Trim,
                                    fila.Cells("Column23").Value, dt.Tables(0).Rows(0)("DCI_Observaciones").ToString.Trim, "", "", fila.Cells("Column22").Value, fila.Cells("Column24").Value)

                Dim dd As DataSet = servicio2.listarArticulosXPedido(fila.Cells(0).Value)
                For a = 0 To dd.Tables(0).Rows.Count - 1
                    dgvReparto.Rows.Add(False, False, "", dd.Tables(0).Rows(a)("ART_Descripcion").ToString.Trim, "", "", "", "", "", "", "", "", "", _
                                        dd.Tables(0).Rows(a)("Cantidad").ToString.Trim, "", "", dd.Tables(0).Rows(a)("DCI_Codigo").ToString.Trim, dd.Tables(0).Rows(a)("DCD_Codigo").ToString.Trim, "", "")
                Next
            Else
                Dim dt As DataSet = servicio2.listarSalidaPedidosXPED(cboVehiculo.SelectedValue.ToString, fila.Cells(0).Value)
                dgvReparto.Rows.Add(False, False, dt.Tables(0).Rows(0)("DCI_Codigo").ToString.Trim, dt.Tables(0).Rows(0)("CLI_Descripcion").ToString.Trim,
                                    dt.Tables(0).Rows(0)("TD").ToString.Trim, dt.Tables(0).Rows(0)("Documento").ToString.Trim, dt.Tables(0).Rows(0)("Guia").ToString.Trim.Trim,
                                    dt.Tables(0).Rows(0)("Condicion").ToString.Trim, dt.Tables(0).Rows(0)("MON_Abreviatura").ToString.Trim,
                                    dt.Tables(0).Rows(0)("Facturado").ToString.Trim, dt.Tables(0).Rows(0)("Pago").ToString.Trim, dt.Tables(0).Rows(0)("LimaProv").ToString.Trim,
                                    dt.Tables(0).Rows(0)("CantBul").ToString.Trim, dt.Tables(0).Rows(0)("CantLargo").ToString.Trim,
                                    fila.Cells("Column23").Value, dt.Tables(0).Rows(0)("DCI_Observaciones").ToString.Trim, "", "", fila.Cells("Column22").Value, fila.Cells("Column24").Value)
            End If
        Next
    End Sub

    Sub cargarVehiculos()
        With cboVehiculo
            .DataSource = servicio1.listarVehiculos().Tables(0)
            .ValueMember = "VEH_Codigo"
            .DisplayMember = "VEH_Placa"
        End With
    End Sub

    Sub iniciar()
        cargarVehiculos()
        listarPedidosSalidas()
        empezar = True
    End Sub

    Private Sub frmReparto_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        iniciar()
    End Sub

    Private Sub cboVehiculo_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles cboVehiculo.SelectedValueChanged
        If empezar = True Then
            listarPedidosSalidas()
        End If
    End Sub

    Sub mostrarCobrado()
        Dim acumulador As Decimal = 0.0
        For Each fila As DataGridViewRow In dgvReparto.Rows
            If fila.Cells("Column11").Value <> "" Then
                acumulador = acumulador + CDec(fila.Cells("Column11").Value)
            End If
        Next

        If acumulador.ToString.Trim.Split(".").Length <= 1 Then
            lblCobrado.Text = acumulador & ".00"
        Else
            lblCobrado.Text = acumulador
        End If
    End Sub

    Sub operacion(e As System.Windows.Forms.DataGridViewCellEventArgs)
        dgvReparto.EndEdit()

        Dim f As Integer = e.RowIndex
        Dim c As Integer = e.ColumnIndex

        If f > -1 Then
            'Si se da click en el contenido del check box total
            If c = 0 Then
                If dgvReparto.Item(0, f).Value = False Then
                    dgvReparto.Item(0, f).Value = False
                Else
                    If dgvReparto.Item(1, f).Value = False And dgvReparto.Item(2, f).Value <> "" Then
                        dgvReparto.Item(0, f).Value = True
                        If dgvReparto.Item(10, f).Value <> "" Then
                            dgvReparto.Item(10, f).Value = "0.00"
                            mostrarCobrado()
                            dgvReparto.Item(10, f).ReadOnly = False
                        Else
                            dgvReparto.Item(10, f).Value = ""
                            dgvReparto.Item(10, f).ReadOnly = True
                        End If
                    Else
                        dgvReparto.Item(0, f).Value = False
                    End If
                End If
                'Si se da click en el contenido del check box parcial
            ElseIf c = 1 Then
                If dgvReparto.Item(1, f).Value = False Then
                    dgvReparto.Item(1, f).Value = False
                    setearFlag(dgvReparto.Item("Column3", f).Value, "")
                    If dgvReparto.Item("Column17", f).Value = "" Then
                        listarConArticulos()
                    End If
                    dgvReparto.Item(10, f).ReadOnly = True
                Else
                    If dgvReparto.Item(0, f).Value = False And dgvReparto.Item(2, f).Value <> "" Or _
                       dgvReparto.Item(0, f).Value = False And dgvReparto.Item(2, f).Value = "" Then
                        dgvReparto.Item(1, f).Value = True
                        setearFlag(dgvReparto.Item("Column3", f).Value, "1")
                        If dgvReparto.Item("Column17", f).Value = "" Then
                            listarConArticulos()
                        End If
                        dgvReparto.Item(10, f).ReadOnly = True
                    Else
                        dgvReparto.Item(1, f).Value = False
                        dgvReparto.Item(10, f).ReadOnly = True
                    End If
                End If
                'si se da click en el contenido de la columna donde se ingresa la cantidad a cobrar
            ElseIf c = 10 Then
                If dgvReparto.Item(0, f).Value = False Then
                    dgvReparto.Item(c, f).ReadOnly = False
                    If dgvReparto.Item(c, f).Value <> "" Then
                        contenido = True
                    End If
                Else
                    dgvReparto.EndEdit()
                    dgvReparto.Item(c, f).ReadOnly = True
                End If
            ElseIf c = 13 Then
                If dgvReparto.Item(1, f).Value = False Then
                    dgvReparto.EndEdit()
                    dgvReparto.Item(c, f).ReadOnly = True
                Else
                    dgvReparto.Item(c, f).ReadOnly = False
                    If dgvReparto.Item(c, f).Value <> "" Then
                        content = dgvReparto.Item(c, f).Value
                    End If
                End If
                'si se da click en el contenido de la columna motivo de rebote
                'abrira otra pantalla para colocar dichos datos
            ElseIf c = 14 Then
                Dim motivo As New frmMotivoRebote(dgvReparto.Item("Column3", f).Value.ToString.Trim, dgvReparto.Item(18, f).Value.ToString.Trim, dgvReparto.Item(19, f).Value.ToString.Trim)
                If motivo.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    dgvReparto.Item(c, f).Value = descMotivo
                    dgvReparto.Item(18, f).Value = codigoMotivo
                    dgvReparto.Item(19, f).Value = obsMotivo
                    setearMotivos(dgvReparto.Item("Column3", f).Value, codigoMotivo, descMotivo, obsMotivo)
                End If
            End If
        End If
    End Sub

    Private Sub dgvReparto_CellContentClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvReparto.CellContentClick
        operacion(e)
    End Sub

    Private Sub dgvReparto_CellContentDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvReparto.CellContentDoubleClick
        operacion(e)
    End Sub

    Private Sub dgvReparto_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvReparto.CellEndEdit
        mostrarCobrado()
        Dim f As Integer = e.RowIndex
        Dim c As Integer = e.ColumnIndex
        If f > -1 Then
            If c = 10 Then
                If dgvReparto.Item(c, f).Value = "" Then
                    If contenido = True Then
                        dgvReparto.Item(c, f).Value = "0.00"
                    End If
                End If
            ElseIf c = 13 Then
                If dgvReparto.Item(c, f).Value = "" Then
                    If content <> 0 Then
                        dgvReparto.Item(c, f).Value = content
                    End If
                End If
            End If
        End If
        contenido = False
        content = 0
    End Sub

    Sub confirmacionRebote()
        If dgvReparto.Rows.Count <> 0 Then
            If MsgBox("¿Esta seguro que desea confirmar la entrega?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
                For Each fila As DataGridViewRow In dgvReparto.Rows
                    '3 casos que se deben de observar
                    'Cuando esta marcado el check box de total no se podra marcar el checkbox de parcial entonces
                    'solo evaluamos el pedido de la columna 3
                    'Se generara cabecera y detalle del documento rebote, su relacion tambien
                    'actualiza el estado del pedido a Rebote
                    'y actualiza el flag programado como "0" y actualiza el flag rebote a T
                    If fila.Cells("Column1").Value = True Then
                        Dim codDocumento As String = servicio3.generarCodigoDocumento("R")
                        servicio3.registrarDocumentoRebote(codDocumento, fila.Cells("Column3").Value, "0", fila.Cells("Column20").Value, fila.Cells("Column21").Value)
                        servicio4.registrarDocumentoReboteDetalle(codDocumento, fila.Cells("Column3").Value)
                        servicio4.registrarDocumentoClienteDetalleRelacion(fila.Cells("Column3").Value, codDocumento)
                        servicio3.actualizarEstadoPedido(fila.Cells("Column3").Value, EST_Rebote, "P")
                        servicio3.actualizarFlagProgramado(fila.Cells("Column3").Value, "P", "0")
                        servicio3.actualizarFlagRebote(fila.Cells("Column3").Value, "P", "T")
                    ElseIf fila.Cells("Column2").Value = True And fila.Cells("Column3").Value <> "" Then
                        'En otro caso puede estar marcada la casilla de parcial en el cual se habra deplegado el listado de
                        'articulos que tiene el pedido tiene que verificar dichas casillas
                        'Se generara cabecera y detalle  y su respectiva relacion
                        'actualiza el estado del pedido a Entregado
                        'y actualiza el flag programado a 0 y actualiza el flag rebote a P
                        Dim codDocumento As String = servicio3.generarCodigoDocumento("R")
                        servicio3.registrarDocumentoRebote(codDocumento, fila.Cells("Column3").Value, "0", fila.Cells("Column20").Value, fila.Cells("Column21").Value)
                        'si es igual a vacio es poque es un item se debe evaluar en la columna de la derecha que
                        'contiene el pedido para eso hacemos un recorrido a los detalles que pertenece a ese pedido
                        For Each fila1 As DataGridViewRow In dgvReparto.Rows
                            If fila1.Cells("Column2").Value = True And fila1.Cells("Column17").Value = fila.Cells("Column3").Value Then
                                servicio4.registrarDocumentoReboteDetalle(codDocumento, fila1.Cells("Column17").Value, fila1.Cells("Column18").Value, fila1.Cells("Column14").Value)
                                Dim relacion As New DocumentoClienteDetalleRelacion("01", "01", "P", fila1.Cells("Column17").Value, fila1.Cells("Column18").Value, "01", "01", "R", codDocumento, fila1.Cells("Column18").Value)
                                servicio4.registrarDocumentoClienteDetalleRelacion(relacion)
                            End If
                        Next
                        servicio3.actualizarEstadoPedido(fila.Cells("Column3").Value, EST_Entregado, "P")
                        servicio3.actualizarFlagProgramado(fila.Cells("Column3").Value, "P", "0")
                        servicio3.actualizarFlagRebote(fila.Cells("Column3").Value, "P", "P")
                    Else
                        'en este caso no se ha marcado nada es porque se entrego todo conforme
                        'solo cambia a estado entregado
                        servicio3.actualizarEstadoPedido(fila.Cells("Column3").Value, EST_Entregado, "P")
                    End If
                    'Todos actualizan la fecha de llegada
                    servicio2.actualizarFechaLlegada(cboVehiculo.SelectedValue.ToString, fila.Cells("Column3").Value)
                Next
                mensaje("Confirmación completada correctamente.")
                listarPedidosSalidas()
            End If
        Else
            mensaje("No hay pedidos por confirmar.")
        End If
    End Sub

    Private Sub btnRebote_Click(sender As System.Object, e As System.EventArgs) Handles btnEntrega.Click
        confirmacionRebote()
    End Sub

End Class